
(function() {



    var WebSocketServer = require('ws').Server;
    var wss = new WebSocketServer({port: 666});
    var objs = {
        arcondicionado: {
            ligado: false,
            temperatura: 25,
            frio: true,
            getMensagem: function(prop) {
                if (prop === "ligado") {
                    var st = this.ligado ? "ligado" : "desligado";
                    return "O ar condicionado está " + st;
                } else if (prop === "temperatura") {
                    return "Temperatura alterada para: " + this.temperatura + "ºC";
                } else if (prop === "frio") {
                    var st = this.frio ? "frio" : "quente";
                    return "Ar condicinado configurado para modo " + st;
                }
            }
        },
        garagem: {
            aberto: false,
            getMensagem: function(prop) {
                if (prop === "aberto") {
                    var st = this.aberto ? "aberta" : "fechada";
                    return "A garagem está " + st + ".";
                }
            }
        },
        luz: {
            ligado: false,
            intensidade: "media",
            getMensagem: function(prop) {
                if (prop === "ligado") {
                    var st = this.ligado ? "ligadas" : "desligadas";
                    return "As luzes estão " + st + ".";
                } else if (prop === "intensidade") {
                    return "Intensidade das luzes alterada para: " + this.intensidade + ".";
                }
            }
        },
        microsystem: {
            ligado: false,
            gavetaAberta: false,
            volume: 50,
            faixa: 1,
            getMensagem: function(prop) {
                if (prop === "ligado") {
                    var st = this.ligado ? "ligado" : "desligado";
                    return "O Micro System está " + st + ".";
                } else if (prop === "gavetaAberta") {
                    var st = this.gavetaAberta ? "aberta" : "fechada";
                    return "A gaveta do Micro System está: " + st + ".";
                } else if (prop === "volume") {
                    return "Volume do Micro System alterado para:" + this.volume + ".";
                } else if (prop === "faixa") {
                    return "O Micro System está tocando a faixa: " + this.faixa + ".";
                }
            }
        },
        microondas: {
            ligado: false,
            tempo: 0,
            iniciado: false,
            getMensagem: function(prop) {
                if (prop === "ligado") {
                    var st = this.ligado ? "ligado" : "desligado";
                    return "O Microondas está " + st + ".";
                } else if (prop === "tempo") {
                    return "Tempo configurado no Microondas: " + this.tempo + "s.";
                } else if (prop === "iniciado") {
                    var st = this.iniciado ? "funcionado" : "parado";
                    return "O Microondas está: " + st + ".";
                }
            }
        },
        televisao: {
            ligado: false,
            canal: 5,
            volume: 50,
            getMensagem: function(prop) {
                if (prop === "ligado") {
                    var st = this.ligado ? "ligada" : "desligada";
                    return "A Televisao está: " + st + ".";
                } else if (prop === "canal") {
                    return "Canal da televisao alterado para: " + this.canal;
                } else if (prop === "volume") {
                    return "Volume da Televisão alterado para: " + this.volume;
                }
            }
        },
        maquinadelavar: {
            ligado: false,
            iniciado: false,
            funcao: "lavar",
            getMensagem: function(prop) {
                if (prop === "ligado") {
                    var st = this.ligado ? "ligada" : "desligada";
                    return "A Máquina de Lavar está: " + st + ".";
                } else if (prop === "iniciado") {
                    var st = this.iniciado ? "lavando" : "parada";
                    return "A Máquina de Lavar está: " + st + ".";
                } else if (prop === "funcao") {
                    return "Função da Máquina alterada para: " + this.funcao;
                }
            }
        }
    };

    function set(prop, val) {
        this[prop] = val;
        console.log(this.getMensagem(prop));
    }


    wss.on('connection', function(socket) {
        socket.on('message', function(message, flags) {
            if (!flags.binary && (typeof message) === "string") {
                try {
                    var msg = JSON.parse(message);
                    switch (msg.equip) {
                        case "arcondicionado":
                            switch (msg.act) {
                                case "ligar":
                                    if (!objs.arcondicionado.ligado) {
                                        set.call(objs.arcondicionado, "ligado", true);
                                    }
                                    break;
                                case "desligar":
                                    if (objs.arcondicionado.ligado) {
                                        set.call(objs.arcondicionado, "ligado", false);
                                    }
                                    break;
                                case "settemperatura":
                                    if (objs.arcondicionado.ligado) {
                                        set.call(objs.arcondicionado, "temperatura", msg.param);
                                    }
                                    break;
                                case "setfrio":
                                    if (objs.arcondicionado.ligado) {
                                        set.call(objs.arcondicionado, "frio", msg.param);
                                    }
                                    break;
                            }
                            break;
                        case "garagem":
                            switch (msg.act) {
                                case "abrir":
                                    if (!objs.garagem.aberto) {
                                        set.call(objs.garagem, "aberto", true);
                                    }
                                    break;
                                case "fechar":
                                    if (objs.garagem.aberto) {
                                        set.call(objs.garagem, "aberto", false);
                                    }
                                    break;
                            }
                            break;
                        case "luz":
                            switch (msg.act) {
                                case "ligar":
                                    set.call(objs.luz, "ligado", true);
                                    break;
                                case "desligar":
                                    set.call(objs.luz, "ligado", false);
                                    break;
                                case "aumentarintensidade":
                                    if (objs.luz.ligado) {
                                        if (objs.luz.intensidade === "baixa") {
                                            set.call(objs.luz, "intensidade", "media");
                                        } else if (objs.luz.intensidade === "media") {
                                            set.call(objs.luz, "intensidade", "alta");
                                        }
                                    }
                                    break;
                                case "diminuirintensidade":
                                    if (objs.luz.ligado) {
                                        if (objs.luz.intensidade === "alta") {
                                            set.call(objs.luz, "intensidade", "media");
                                        } else if (objs.luz.intensidade === "media") {
                                            set.call(objs.luz, "intensidade", "baixa");
                                        }
                                    }
                                    break;
                            }
                            break;
                        case "microsystem":
                            switch (msg.act) {
                                case "ligar":
                                    if (!objs.microsystem.ligado) {
                                        set.call(objs.microsystem, "ligado", true);
                                    }
                                    break;
                                case "desligar":
                                    if (objs.microsystem.ligado) {
                                        set.call(objs.microsystem, "ligado", false);
                                    }
                                    break;
                                case "setfaixa":
                                    if (objs.microsystem.ligado) {
                                        if (msg.param > 0 && msg.param < 100)
                                            set.call(objs.microsystem, "faixa", msg.param);
                                    }
                                    break;
                                case "proximafaixa":
                                    if (objs.microsystem.ligado) {
                                        if (objs.microsystem.faixa < 100)
                                            set.call(objs.microsystem, "faixa", objs.microsystem.faixa + 1);
                                    }
                                    break;
                                case "faixaAnterior":
                                    if (objs.microsystem.ligado) {
                                        if (objs.microsystem.faixa > 1)
                                            set.call(objs.microsystem, "faixa", objs.microsystem.faixa - 1);
                                    }
                                    break;
                                case "volumeup":
                                    if (objs.microsystem.ligado) {
                                        if (objs.microsystem.volume < 96)
                                            set.call(objs.microsystem, "volume", objs.microsystem.volume + 5);
                                    }
                                    break;
                                case "volumedown":
                                    if (objs.microsystem.ligado) {
                                        if (objs.microsystem.volume > 4)
                                            set.call(objs.microsystem, "volume", objs.microsystem.volume - 5);
                                    }
                                    break;
                                case "abrirgaveta":
                                    if (objs.microsystem.ligado && !objs.microsystem.gavetaAberta) {
                                        set.call(objs.microsystem, "gavetaAberta", true);
                                    }
                                    break;
                                case "fechargaveta":
                                    if (objs.microsystem.ligado && objs.microsystem.gavetaAberta) {
                                        set.call(objs.microsystem, "gavetaAberta", false);
                                        set.call(objs.microsystem, "faixa", 1);
                                    }
                                    break;
                            }
                            break;
                        case "microondas":
                            switch (msg.act) {
                                case "ligar":
                                    if (!objs.microondas.ligado) {
                                        set.call(objs.microondas, "ligado", true);
                                    }
                                    break;
                                case "desligar":
                                    if (objs.microondas.ligado) {
                                        set.call(objs.microondas, "ligado", false);
                                    }
                                    break;
                                case "settempo":
                                    if (objs.microondas.ligado) {
                                        if (msg.param > -1 && msg.param < 100)
                                            set.call(objs.microondas, "tempo", msg.param);
                                    }
                                    break;
                                case "iniciar":
                                    if (objs.microondas.ligado && !objs.microondas.iniciado) {
                                        set.call(objs.microondas, "iniciado", true);
                                    }
                                    break;
                                case "pausar":
                                    if (objs.microondas.ligado && objs.microondas.iniciado) {
                                        set.call(objs.microondas, "iniciado", false);
                                    }
                                    break;
                                case "parar":
                                    if (objs.microondas.ligado) {
                                        if (objs.microondas.iniciado) {
                                            set.call(objs.microondas, "iniciado", false);
                                        }
                                        set.call(objs.microondas, "tempo", 0);
                                    }
                                    break;

                            }
                            break;
                        case "televisao":
                            switch (msg.act) {
                                case "ligar":
                                    if (!objs.televisao.ligado) {
                                        set.call(objs.televisao, "ligado", true);
                                    }
                                    break;
                                case "desligar":
                                    if (objs.televisao.ligado) {
                                        set.call(objs.televisao, "ligado", false);
                                    }
                                    break;
                                case "setcanal":
                                    if (objs.televisao.ligado) {
                                        if (msg.param > -1 && msg.param < 100)
                                            set.call(objs.televisao, "canal", msg.param);
                                    }
                                    break;
                                case "proximocanal":
                                    if (objs.televisao.ligado) {
                                        if (objs.televisao.canal < 100)
                                            set.call(objs.televisao, "canal", objs.televisao.canal + 1);
                                    }
                                    break;
                                case "canalanterior":
                                    if (objs.televisao.ligado) {
                                        if (objs.televisao.canal > 0)
                                            set.call(objs.televisao, "canal", objs.televisao.canal - 1);
                                    }
                                    break;
                                case "aumentarvolume":
                                    if (objs.televisao.ligado) {
                                        if (objs.televisao.volume < 96)
                                            set.call(objs.televisao, "volume", objs.televisao.volume + 5);
                                    }
                                    break;
                                case "diminuirvolume":
                                    if (objs.televisao.ligado) {
                                        if (objs.televisao.volume > 4)
                                            set.call(objs.televisao, "volume", objs.televisao.volume - 5);
                                    }
                                    break;

                            }
                            break;
                        case "maquinadelavar":
                            switch (msg.act) {
                                case "ligar":
                                    if ((typeof msg.param) === "boolean" && msg.param !== objs.maquinadelavar.ligado) {
                                        set.call(objs.maquinadelavar, "ligado", msg.param);
                                    }
                                    break;
                                case "iniciar":
                                    if (objs.maquinadelavar.ligado && !objs.maquinadelavar.iniciado) {
                                        set.call(objs.maquinadelavar, "iniciado", true);
                                    }
                                    break;
                                case "parar":
                                    if (objs.maquinadelavar.ligado && objs.maquinadelavar.iniciado) {
                                        set.call(objs.maquinadelavar, "iniciado", false);
                                    }
                                    break;
                                case "pularfuncao":
                                    if (objs.maquinadelavar.ligado) {
                                        if (objs.maquinadelavar.funcao === "lavar") {
                                            set.call(objs.maquinadelavar, "funcao", "enxaguar");
                                        } else if (objs.maquinadelavar.funcao === "enxaguar") {
                                            set.call(objs.maquinadelavar, "funcao", "secar");
                                        }
                                    }
                                    break;
                                case "voltarfuncao":
                                    if (objs.maquinadelavar.ligado) {
                                        if (objs.maquinadelavar.funcao === "secar") {
                                            set.call(objs.maquinadelavar, "funcao", "enxaguar");
                                        } else if (objs.maquinadelavar.funcao === "enxaguar") {
                                            set.call(objs.maquinadelavar, "funcao", "lavar");
                                        }
                                    }
                                    break;
                            }
                            break;
                    }
                } catch (e) {
                    console.log("comando desconheciado ou mal formatado.");
                }
            }
        });
        socket.on('close', function() {

        });
        socket.on('error', function() {
            try {
                socket.close();
            } catch (e) {

            } finally {
                console.log("conexão perdida.");
            }
        });
    });


})();